package com.cws.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Page<E> implements Serializable {

    private static final long serialVersionUID = 5727773299567371087L;

    /** 查询结果 */
    private List<E> result;

    /** 分页信息Bean */
    private PageBean pageBean;

    /**
     * 默认构ꀦֹ法
     */
    public Page() {
    }

    /**
     * 根据查询结果、分页信息构逿     * 
     * @param result 查询结果
     * @param pageBean 分页信息Bean
     */
    public Page(List<? extends E> result, PageBean pageBean) {
        setResult(result);
        setPageBean(pageBean);
    }

    /**
     * 取得查询结果
     * 
     * @return 查询结果
     */
    public List<E> getResult() {
        return result;
    }

    /**
     * 设置查询结果
     * 
     * @param result 查询结果
     */
    public void setResult(List<? extends E> result) {
        this.result = (result == null ? null : new ArrayList<E>(result));
    }

    /**
     * 取得分页信息Bean
     * 
     * @return 分页信息Bean
     */
    public PageBean getPageBean() {
        if (pageBean == null && result != null) {
            pageBean = new PageBean();
            pageBean.setCount(result.size());
            pageBean.setPage(1);
        }
        return pageBean;
    }

    /**
     * 设置分页信息Bean
     * 
     * @param pageBean 分页信息Bean
     */
    public void setPageBean(PageBean pageBean) {
        this.pageBean = pageBean;
    }

    /**
     * 合并两个Page对象，前丿u缺的数据自动补全
     * 
     * @param combinePage 合并Page对象
     */
    public void combine(Page<? extends E> combinePage) {
        combine(combinePage, true);
    }

    /**
     * 合并数据
     * 
     * @param combinePage 待合并的数据
     * @param autoSkip 是否自动计算霿Ɓ补充到前丿u的数捿     */
    public void combine(Page<? extends E> combinePage, boolean autoSkip) {
        PageBean pageBean = getPageBean();
        PageBean combinedBean = combinePage.getPageBean();

        // 合并数据
        int currentPageNum = result.size();
        // 不满页，补充
        if (currentPageNum < pageBean.getPageSize()) {
            if (pageBean.getPage() == 1) {
                if (combinedBean.getCount() < (pageBean.getPageSize() - currentPageNum)) {
                    getResult().addAll(combinePage.getResult());
                } else {
                    getResult().addAll(combinePage.getResult().subList(0,
                            pageBean.getPageSize() - pageBean.getEndNo()));
                }
            } else {
                int skipNum = 0;
                if (autoSkip) {
                    skipNum = pageBean.getPageSize() - pageBean.getEndNo();
                }
                if (combinePage.getResult().size() > skipNum) {
                    getResult().addAll(combinePage.getResult().subList(skipNum,
                            combinePage.getResult().size()));
                }
            }
        }
        // 总数
        pageBean.setCount(pageBean.getCount() + combinedBean.getCount());
    }
}

